<?php
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

//$teste = setlocale(LC_ALL, "ptb_bra");

include_once 'abstract_dao.php';

class dao_consulta extends abstract_dao{

    private $model;
    
    /**
     * O construtor recebe o modelo para tratar os dados
     * @param abstract_model $model Modelo para tratar os dados
     */
    public function __construct(abstract_model $model) {
        parent::__construct();
        $model->setValidate(FALSE);
        $this->model = $model;
    }
    
    /**
     * Consulta a quantidade registros cadastrados
     * @param string $sql Sql para ser computada o resultado
     * @param Array() $parametros Parametros para o prepared statement
     * @return integer Quantidade de clientes cadastrados
     */
    public function count_consulta($sql, $parametros){
        $retorno = array();
        $stmt = $this->pdo->prepare($sql);
        
        $stmt->execute($parametros);
        if ($stmt->rowCount() == 1){
            $rs = $stmt->fetch();
            return $rs[0];
        }
        return NULL;
    }
    
    /**
     * Consulta os registros
     * @param string $sql Sql para consulta
     * @param Array() $parametros Parametros para o prepared statement
     * @return Array
     */
    public function select_consulta($sql, $parametros){
        $retorno = array();
        $stmt = $this->pdo->prepare($sql);
        
        if ($stmt){
            $stmt->execute($parametros);
            while($dados = $stmt->fetch(PDO::FETCH_ASSOC)){
                $retorno[] = $dados;
            }
        }else
            return NULL;
        return $retorno;
    }
    
    /**
     * Processa os campos do form populando o vetor parametros
     * e retorna uma string where
     * @param Array $campos vetor do form para com os dados 
     * @param Array $this->model modelo para processar os dados 
     * @param Array $parametros vetor para receber os dados para o where
     * @return string String contendo os campos where
     */
    public function processa_where($campos, &$parametros){
        $where = Array();
        if($campos){
    
            foreach ($campos as $campo => $valor) {
                
                // Codigo que acrescenta um prefixo para o parametro
                $split = explode("$", $campo);
                
                // Checando a validade do prefixo
                if(sizeof($split) > 2) continue;
                if(sizeof($split) == 2){
                    // Se nao existir o prefixo continua
                    if (! $this->model->hasPrefix($split[0])){
                        continue;
                    }
                    // Se existe substitui o dolar por ponto
                    $campo = str_replace("$", ".", $campo);
                }
                
                // Pego o ultimo elemento do array
                $model_campo = array_pop($split);
                // Se não existe a propriedade pulo para o proximo campo
                if(! $this->model->hasProperty($model_campo)){
                    continue;
                }
                // Metodo do model
                $metodo = "set".$model_campo;

                if (is_array($valor) ){
                    // Se o valor de campo 1 nao for em branco
                    if ($valor["campo1"] != ""){
                        switch ($valor["criterio"]){
                            case "contem":
                                // Acrescento a clausula where dentro do vetor $where onde o nome do parametro corresponde ao seu indice no vetor
                                $where[] = "$campo LIKE ?";
                                // Formato o dado para o banco de dados
                                $this->model->$metodo($valor["campo1"]);
                                // Acrescento o valor dentro do vetor $parametros
                                $parametros[] = "%".$this->model->$model_campo."%";
                                break;
                            case "inicia":
                                // Acrescento a clausula where dentro do vetor $where onde o nome do parametro corresponde ao seu indice no vetor
                                $where[] = "$campo LIKE ?";
                                // Formato o dado para o banco de dados
                                $this->model->$metodo($valor["campo1"]);
                                // Acrescento o valor dentro do vetor $valores
                                $parametros[] = $this->model->$model_campo."%";
                                break;
                            case "termina":
                                // Acrescento a clausula where dentro do vetor $where onde o nome do parametro corresponde ao seu indice no vetor
                                $where[] = "$campo LIKE ?";
                                // Formato o dado para o banco de dados
                                $this->model->$metodo($valor["campo1"]);
                                // Acrescento o valor dentro do vetor $valores
                                $parametros[] = "%".$this->model->$model_campo;
                                break;
                            case "igual":
                                // Acrescento a clausula where dentro do vetor $where onde o nome do parametro corresponde ao seu indice no vetor
                                $where[] = "$campo = ?";
                                // Formato o dado para o banco de dados
                                $this->model->$metodo($valor["campo1"]);
                                // Acrescento o valor dentro do vetor $valores
                                $parametros[] = $this->model->$model_campo;
                                break;
                            case "maior":
                                // Acrescento a clausula where dentro do vetor $where onde o nome do parametro corresponde ao seu indice no vetor
                                $where[] = "$campo >= ?";
                                // Formato o dado para o banco de dados
                                $this->model->$metodo($valor["campo1"]);
                                // Acrescento o valor dentro do vetor $valores
                                $parametros[] = $this->model->$model_campo;
                                break;
                            case "menor":
                                // Acrescento a clausula where dentro do vetor $where onde o nome do parametro corresponde ao seu indice no vetor
                                $where[] = "$campo <= ?";
                                // Formato o dado para o banco de dados
                                $this->model->$metodo($valor["campo1"]);
                                // Acrescento o valor dentro do vetor $valores
                                $parametros[] = $this->model->$model_campo;
                                break;
                            case "entre":
                                if ($valor["campo2"] == "")
                                    break;
                                // Acrescento a clausula where dentro do vetor $where onde o nome do parametro corresponde ao seu indice no vetor
                                $where[] = "$campo BETWEEN ? AND ?";
                                // Formato o campo1 para o banco de dados
                                $this->model->$metodo($valor["campo1"]);
                                // Acrescento o valor dentro do vetor $valores
                                $parametros[] = $this->model->$model_campo;

                                // Formato o campo2 para o banco de dados
                                $this->model->$metodo($valor["campo2"]);
                                // Acrescento o valor dentro do vetor $valores
                                $parametros[] = $this->model->$model_campo;
                                break;
                        }
                    }
                }else if ($valor != ""){
                    // Acrescento a clausula where dentro do vetor $where onde o nome do parametro corresponde ao seu indice no vetor
                    $where[] = "$campo = ?";
                    // Formato o dado para o banco de dados
                    $this->model->$metodo($valor);
                    // Acrescento o valor dentro do vetor $valores
                    $parametros[] = $this->model->$model_campo;
                }
            }
        }

        //echo "parametros</br>";
        //print_r($parametros);

        $string_where = "";
        if (sizeof($where) > 0){
            $string_where .= " WHERE ";
            for($i = 0; $i < sizeof($where); $i++ ){
                $string_where .= $where[$i];
                if ($i != sizeof($where)-1){
                    $string_where .= " AND ";
                }
            }
        }
        
        return $string_where;
    }

}

?>
